# 레이블과 애너테이션

Assembled by GimunLee


# 레이블

  • 레이블은 키-값 쌍으로 구성하며, 사용자가 클러스터 안에 오브젝트를 만들 때 메타데이터로 설정할 수 있음
  • 레이블의 키는 쿠버네티스 안에서 컨트롤러들이 파드를 관리할 때 자신이 관리해야할 파드를 구분하는 역할
  • 쿠버네티스는 레이블 만으로 관리 대상을 구분하므로 특정 컨트롤러가 만든 파드라도 레이블을 변경하면 인식할 수 없음
  • 레이블 덕분에 컨트롤러와 파드는 느슨한 결합도를 가짐
  • 접두어가 있는 레이블의 키는 쿠버네티스 시스템에서 사용하는 레이블(kubernetes.io)
  • 레이블을 선택하는 조건을 다양하게 혼합해서 사용할 수 있는 것이 쿠버네티스의 강력한 장점

# 활용

  • 레이블을 이용해 운영하고 있는 서비스에 영향 없이 현재 이슈가 발생한 파드만을 따로 분리해서 확인 가능
  • 노드에도 레이블을 설정할 수 있으므로 클러스터 안 노드들을 레이블로 구분한 다음 특정 레이블이 있는 노드에만 자원 할당 가능

# 레이블 셀렉터(Label Selector)

  • 사용자가 특정 레이블을 설정한 자원만 선택해서 관리 가능
  • 레이블 셀렉터는 등호 기반(equality-based), 집합 기반(set-based) 두 가지 방식으로 설정

# 예시1)

environment=develop
release=stable
  • 레이블의 키가 enviroment인 것 중 값이 develop인 것들을 선택
  • 레이블의 키가 release인 것 중 값이 stable인 것들을 선택
  • 두가지 모두 만족시키는 것을 찾으려면 쉼표(,)로 연결

# 예시2)

environment in (develop, stage)
release notin (latest, canary)
gpu
!gpu
  • enviroment가 develop이거나 stage인 레이블을 선택
  • release가 lastest와 canary가 아닌 레이블을 선택
  • release라는 키가 없는 모든 오브젝트를 선택
  • gpu라는 레이블 키가 있는 모든 레이블을 선택
  • gpu라는 키가 없는 모든 레이블 선택

# 사용

$ kubectl get pods -l app=nginx

$ kubectl get pods -l evironment=develop, release=stable

$ kubectl get pods -l "app=nginx,environment not in (develop)"

# 애너테이션

  • 애너테이션은 레이블과 마찬가지로 키-값 쌍으로 구성하며 레이블처럼 사용자가 설정 가능

  • 레이블이 사용자가 설정한 특정 레이블의 오브젝트들을 선택한다면, 애너테이션은 쿠버네티스 시스템이 필요한 정보들을 담았으며, 쿠버네티스 클라이언트나 라이브러리가 자원을 관리하는데 활용

  • 애너테이션의 키는 쿠버네티스 시스템이 인식할 수 있는 값을 사용

  • 예를 들어 디플로이먼트로 앱을 배포할 때 변경 사유를 적는 CHANGE-CAUSE(kebernetes.io/change-cause) 정보를 작성하는 것

  • 사용자에게 필요한 정보들을 메모하는 용도로 사용 가능

  • 릴리즈 정보, 로깅, 모니터링에 필요한 정보들, 비상 연락처를 적어둘 수 있음


# 배포 방법

# 롤링업데이트

  • 배포된 전체 파드를 한꺼번에 교체하는 것이 아니라 일정 개수씩 교체하면서 배포(디플로이먼트의 기본 배포 방법)

# 블루/그린

  • 기존에 실행된 파드 개수와 같은 개수의 신규 파드를 모두 실행한 후 신규 파드가 정상적으로 실행됐는지 확인
  • 트래픽을 한꺼번에 신규 파드쪽으로 옮김

# 카나리

  • 신규 파드를 배포할 때 한꺼번에 앱 컨테이너 전체를 교체하지 않고, 기존 버전을 유지한 채로 일부 버전만 신규 파드로 교체
  • 버그나 이상은 없는지, 사용자 반응은 어떤지 확인할 때 유용

# Referenses

  • 쿠버네티스 입문 - 90가지 예제로 배우는 컨테이너 관리 자동화 표준 / 동양북스
Last Updated: 8/12/2020, 1:33:42 PM